#ifndef EVENT_LOOP_H
#define EVENT_LOOP_H

#include "abstract_event.h"
#include <memory>

namespace event
{
class EventLoopData;

/**
 * @brief:  事件循环执行器
 * @author: sherlock_lht
 */
class EventLoop
{
public:
  explicit EventLoop();
  virtual ~EventLoop();

  /**
   * @brief:  阻塞式循环执行事件，直到stopExec()调用
   * @author: sherlock_lht
   */
  void exec();

  /**
   * @brief:  终止循环事件(exec())执行
   * @author: sherlock_lht
   */
  void stopExec();

  /**
   * @brief:  执行一次事件，如果没有未执行的事件，则什么都不做
   * @author: sherlock_lht
   */
  void execOnce();

  /**
   * @brief:  添加事件
   * @author: sherlock_lht
   */
  void addEvent(const EventInterfaceSharedPtr &event);

  /**
   * @brief:  添加事件，支持lambda等简单函数
   * @author: sherlock_lht
   */
  template<typename Body>
  void addSimpleEvent(Body &&body)
  {
    addEvent(std::make_shared<SimpleEventInterface<Body>>(std::forward<Body>(body)));
  }

  /**
   * @brief:  清空未执行的事件
   * @author: sherlock_lht
   */
  void clearEvent();

private:
  std::unique_ptr<EventLoopData> d_;
};

}// namespace event

#endif//EVENT_LOOP_H
